package com.special.threademo.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author liuYC
 * @ClassName OomDemo
 * @Description TODO
 * @date 2021/4/26 16:06
 *
 *
 * 以看出来是堆外内存溢出，因为我们新建的线程都在工作（代码中用sleep表示在工作中），
 * newCachedThreadPool 只会重用空闲并且可用的线程，所以上述代码只能不停地创建新线程，
 * 在 64-bit JDK 1.7 中 -Xss 默认是 1024k，也就是 1M，那就是需要 10000*1M = 10G 的堆外内存空间来给线程使用，
 * 但是我的机器总共就 8G 内存，不够创建新的线程，所以就 OOM 了。
 */

public class OomDemo {

    public static void main(String[] args) {

        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 1; i < 100000; i++)
            executorService.submit(new task());

    }

}

class task implements Runnable {

    @Override
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
